GIT - https://git.gosuslugi.local/ervu/source/s3-proxy/


Требование

https://jira.egovdev.ru/browse/ERVU-8660


Описание

Задача - https://jira.egovdev.ru/browse/ERVU-8660

Требование: уйти от прямых ссылок на скачивание \ предпросмотр файлов, перевести работу фронта с s3-хранилищем на прокси-сервис (этот), доступ к которому скрыт за proxy-gateway.

Сервис для работы фронта с s3, предоставляет эндпоинты для скачивания, загрузки, архивации и извлечения файлов. В контуре, как и остальные сервисы фронта, сервис скрыт за proxy-gateway.

REST

|GET|  ./download/v1

Выгрузка файла из s3 хранилища, вернёт стрим файла

Строковые параметры (query string) запроса

  • s3Link - s3 url encoded или decoded ссылка на файл
  • fileName - Оригинальное имя файла (для хедера Content-Disposition: attachment; filename = ...) Если параметр присутствует, то файл сохранится под этим именем, если отсутствует, то пробуем найти это имя в юзер-метадате запрашиваемого файла под ключом 'name' (логика mz-adapter), если и там не нашли, то вернётся текущее имя файла из хранилища

Тело ответа: содержимое файла.

Хедеры ответа:

content-type - binary/octet-stream
content-disposition - имя файла по спецификации RFC 6266

Пример запроса

./s3-proxy/download/v1?s3Link=s3://bucket/actualName.zip&fileName=rightName.zip

Пример curl

curl --request GET \
  --url 'http://localhost:8080/download/v1?s3Link=s3%3A%2F%2Fbucket%2Ffilename.zip&fileName=rightName.zip' \
  --header 'Authorization: Bearer TOKEN'


|PUT|  ./upload/v1

Загружает файл в s3 хранилище, добавляет суффикс к имени файла, чтобы поддержать уникальные имена в хранилище, возвращает s3 ссылку, вида s3://bucket/objectKey-{suffix}.{extension}, пример - s3://printer/filename-0123456789.zip

Строковые параметры запроса

  • objectKey - ключ объекта для сохранения, может быть пустой, в этом случае будет использовано имя загружаемого файла, может быть составной ключ, вида "2025/05/01/filename.txt", тогда в хранилище будет создана соответствующая структура "папок" и итоговая ссылка будет вида s3://bucket/2025/05/01/filename-{suffix}.txt
  • bucket - бакет для сохранения файла, может быть пустой, в этом случае будет использован дефолтный

Тело запроса

  • file - multipart/form-data контент файла 

Тело ответа 

  • s3Link - ссылка на файл в s3 хранилище

Пример запроса

./s3-proxy/upload/v1?objectKey=testfile321.zip&bucket=proxy

Пример ответа

response_200 Развернуть исходный код


Пример curl

curl --request PUT \
  --header 'Authorization: Bearer TOKEN' \
  --header 'content-type: multipart/form-data' \
  --form 'file=@C:\Users\AdminLocal\Desktop\example.xml'

|POST|  ./archive/v1

Синхронно создает zip-архив из объектов с указанными URL и отдает клиенту ответ с ссылкой в s3 на архив, также отправляет ответ в топик s3proxy.archive

Тело запроса

  • objectUrls - массив s3 ссылок на файлы для архивации 
  • resultArchiveObjectKey - имя файла для итогового архива, если такой файл уже существует в хранилище - вернётся ошибка

Тело ответа 

  • success - флаг успешности операции
  • s3Url - s3 ссылка на итоговый архив
  • dateTime - время окончания операции

Пример запроса

./s3-proxy/archive/v1

request Развернуть исходный код

Пример ответа

response_200 Развернуть исходный код


Пример curl

curl --request POST \
  --url http://localhost:8080/archive/v1 \
  --header 'Authorization: Bearer TOKEN' \
  --header 'content-type: application/json' \
  --data '{
  "objectUrls": [
    "s3://bucket/file1.zip",
    "s3://bucket/file2.zip"
  ],
  "resultArchiveObjectKey":"resultArchive.zip"
}'


|POST|  ./archive-async/v1

Асинхронно создает zip-архив из объектов с указанными URL, отправляет ответ в топик s3proxy.archive

Тело запроса

  • objectUrls - массив s3 ссылок на файлы для архивации 
  • resultArchiveObjectKey - имя файла для итогового архива, если такой файл уже существует в хранилище - вернётся ошибка

Тело ответа контроллера

  • success - флаг успешности операции

Тело ответа сообщения в кафку

  • success - флаг успешности операции
  • s3Url - s3 ссылка на итоговый архив
  • dateTime - время окончания операции

Пример запроса

./s3-proxy/archive-async/v1

request Развернуть исходный код

Пример ответа контроллера

response_200 Развернуть исходный код

Пример ответа в кафку

response_200 Развернуть исходный код


Пример curl

curl --request POST \
  --url http://localhost:8080/archive-async/v1 \
  --header 'Authorization: Bearer TOKEN' \
  --header 'content-type: application/json' \
  --data '{
  "objectUrls": [
    "s3://bucket/file1.zip",
    "s3://bucket/file2.zip"
  ],
  "resultArchiveObjectKey":"resultArchive.zip"
}'


|POST|  ./archive-download/v1

Создает zip-архив из объектов с указанными URL и отдает клиенту, вернёт стрим файла

Тело запроса

  • objectUrls - массив s3 ссылок на файлы для архивации 

Тело ответа: содержимое файла (созданный архив).

Хедеры ответа:

content-type - binary/octet-stream
content-disposition - имя файла по спецификации RFC 6266

Пример запроса

./s3-proxy/archive-download/v1

request Развернуть исходный код


Пример curl

curl --request POST \
  --url http://localhost:8080/archive-download/v1 \
  --header 'Authorization: Bearer TOKEN' \
  --header 'content-type: application/json' \
  --data '{
  "objectUrls": [
    "s3://bucket/file1.zip",
    "s3://bucket/file2.zip"
  ]
}'



|GET|  ./extract/v1

Выгружает архив из s3 хранилища, распаковывает, определяет и отдаёт нужный файл, вернёт стрим файла

Строковые параметры (query string) запроса

  • s3Link - s3 url encoded или decoded ссылка на файл
  • type - указатель на тип файла, enum {file / sign}, file - для получения основного файла (.pdf), sign - для получения файла подписи (.sig)

Тело ответа: содержимое распакованного файла.

Хедеры ответа:

content-type - binary/octet-stream
content-disposition - имя файла по спецификации RFC 6266

Пример запроса

./s3-proxy/extract/v1?s3Link=s3://bucket/filename.zip&type=sign

Пример curl

curl --request GET \
  --url 'http://localhost:8080/extract/v1?s3Link=s3%3A%2F%2Fbucket%2Ffilename.zip&type=sign' \
  --header 'Authorization: Bearer TOKEN'


Написать комментарий...